#include"DynamicArray.h"
#include<iostream>
#include<cstring>
#include<stdlib.h>

class Student
{
public:
    Student(std::string name,int score):name(name),score(score){}
    ~Student(){FreeStu(this);}

    // std::string ReName(){return this->name;}
    // int ReScore(){return score;}
public:
    std::string name;
    int score; 
};

int SortStu(void *ptr1, void* ptr2)
{
    Student* s1 = (Student*)ptr1;
    Student* s2 = (Student*)ptr2;
    if((s1->name) == (s2->name))
    {
        return (s1->score) - (s2->score);
    }
    else
    {
        if((s1->name) > (s2->name)) return 1;
        else return -1;
    }
    return 0;
}

bool EqualStu(void* ptr1, void* ptr2)
{
    Student* s1 = (Student*)ptr1;
    Student* s2 = (Student*)ptr2; 
    if(s1->name == s2->name && s1->score == s2->score) return 0;
    else return 1;
}

void PrintStu(void* ptr)
{
    Student* s = (Student*)ptr;
    std::cout << "姓名:" << s->name << " 得分:" << s->score << std::endl;
}

void FreeStu(void* ptr)
{
    Student *s = (Student*)ptr;
    delete s;
}

int main()
{
    // DynamicArray a(15);
    // for(int i = 0; i < 10; i ++)
    // {
    //     a.InsertTail(i+1);
    // }
    // for(int i = 0; i < 10; i ++)
    // {
    //     a.InsertHead(i + 1);
    // }
    // a.InsertByIndex(1,99);
    // a.RemoveByIndex(1);
    // a.RemoveByElement(1);

    // ElementType* p = a.FindByIndex(15);
    // if(p)
    //     std::cout << *p << std::endl;
    // else
    //     std::cout << "没找到" << std::endl;

    // DynamicArray result = a.FindByElement(8);

    // a.UpdateByIndex(0, 100);
    // a.show();

    // a.UpdateByElement(9, 999);
    // a.Sort();
    // a.show();
    // a.Duplicate();
    // a.show();
    // result.show();

    // DynamicArray a1;
    // DynamicArray a2;
    // for(int i = 0; i <= 10; i += 2)
    // {
    //     a1.InsertTail(i);
    // }

    // DynamicArray a2;
    // for(int i = 1; i <= 9; i += 2)
    // {
    //     a2.InsertTail(i);
    // }
    // a1.show();
    // a2.show();
    // a1.Merge(a2).show();

    // DynamicArray a1;
    // DynamicArray a2;

    // a1.InsertTail(1);
    // a1.InsertTail(2);
    // a1.InsertTail(3);

    // a2.InsertTail(1);
    // a2.InsertTail(2);
    // // a2.InsertTail(4);

    // // a1.FdDifference(a2).show();
    // std::cout << a1.IsCntnsChils(a2) << std::endl;

    DynamicArray class267;
    DynamicArray class262;

    Student *s1 = new Student("张三",90);
    Student *s2 = new Student("李四",100); 
    Student *s3 = new Student("张三",90);
    Student *s4 = new Student("王五",90);
    Student *s5 = new Student("赵六",100);
    class267.InsertTail(s1);
    class267.InsertTail(s2);
    class267.InsertTail(s3);
    class267.InsertTail(s4);
    class267.SetSortPtr(SortStu);
    class267.SetPrintPtr(PrintStu);
    class267.SetEqualPtr(EqualStu);
    class267.SetFreePtr(FreeStu);

    class262.InsertTail(s1);
    class262.InsertTail(s2);
    class262.SetSortPtr(SortStu);
    class262.SetPrintPtr(PrintStu);
    class262.SetEqualPtr(EqualStu);
    class262.SetFreePtr(FreeStu);

    // std::cout << class267.Size() << std::endl;
    // class267.Sort();
    class267.show();

    // DynamicArray a = class267.FindByElement(s1);
    // a.showIndex();

    // class267.RemoveByIndex(0);

    // class267.RemoveByElement(s2);

    // class267.UpdateByIndex(0,s3);

    // class267.Duplicate();

    Student **s4 = (Student**)class267.FindByIndex(0);
    // PrintStu(*s4);

    // class267.Sort();
    // size_t i = class267.BinarySearch(s3);
    // std::cout << i << std::endl;
    
    // std::cout << class267.IsChild(class262) << std::endl;
    std::cout << class267.IsCntnsChils(class262) << std::endl;

    // DynamicArray s = class267.FdUnionSet(class262);
    // s.SetSortPtr(SortStu);
    // s.SetPrintPtr(PrintStu);
    // s.SetEqualPtr(EqualStu);
    // s.SetFreePtr(FreeStu);
    // s.show();
    return 0;
}